﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Module.NumberGame.Common
{
    public static class Functions
    {
        /// <summary>
        /// 根据输入的四个数字，计算向第一数字合并的结果，并返回每个数字移动的步数（用于动画处理）
        /// </summary>
        /// <param name="a">第一个数字，-1表示为空，0-10为有效数字，该位置的数字移动步数始终为0。</param>
        /// <param name="b">第二数字</param>
        /// <param name="c">第三个数字</param>
        /// <param name="d">第四个数字</param>
        /// <returns>返回一个二维数组，第一位表示数字合并后的结果，第二位表示移动的步数</returns>
        public static int[,] ArrayProcess(int a = -1, int b = -1, int c = -1, int d = -1)
        {
            int[,] reslt = new int[4, 2];

            // 计算移动步数，每行的注释为示例，其中的0代表空位，对应实际数据中的-1
            
            reslt[0, 1] = 0; // 第一个数字无需移动
            
            // 以下第二数字的移动步数
            if (a == -1 && b != -1) reslt[1, 1] = 1;    // 0,1,?,?
            if (a != -1 && a == b) reslt[1, 1] = 1;     // 1,1,?,?
            
            // 以下为第三数字的移动步数
            if (a == -1 && b == -1 && c != -1) reslt[2, 1] = 2;                         // 0,0,1,?
            if (a == -1 && b != -1 && b == c) reslt[2, 1] = 2;                          // 0,1,1,?
            if (a == -1 && b != -1 && c != -1 && b != c) reslt[2, 1] = 1;               // 0,1,2,?
            if (a != -1 && b == -1 && a == c) reslt[2, 1] = 2;                          // 1,0,1,?
            if (a != -1 && b == -1 && a != c) reslt[2, 1] = 1;                          // 1,0,2,?
            if (a != -1 && a == b && c != -1) reslt[2, 1] = 1;                          // 1,1,2,?
            if (a != -1 && b != -1 && c != -1 && a != b && b == c) reslt[2, 1] = 1;     // 1,2,2,?
            
            // 以下为第四数字的移动步数
            if (a == -1 && b == -1 && c == -1 && d != -1) reslt[3, 1] = 3;                      // 0,0,0,1
            if (a == -1 && b == -1 && c != -1 && d != -1 && c == d) reslt[3, 1] = 3;            // 0,0,1,1
            if (a == -1 && b == -1 && c != -1 && d != -1 && c != d) reslt[3, 1] = 2;            // 0,0,1,2
            if (a == -1 && b != -1 && c != -1 && b == c && d != -1) reslt[3, 1] = 2;            // 0,1,1,?
            if (a == -1 && b != -1 && c != -1 && b != c && d != -1 && c == d) reslt[3, 1] = 2;  // 0,1,2,2
            if (a == -1 && b != -1 && c != -1 && b != c && d != -1 && c != d) reslt[3, 1] = 1;  // 0,1,2,3

            if (a != -1 && b == -1 && c == -1 && d != -1 && a == d) reslt[3, 1] = 3;    // 1,0,0,1
            if (a != -1 && b == -1 && c == -1 && d != -1 && a != d) reslt[3, 1] = 2;    // 1,0,0,2
            if (a != -1 && b == -1 && c != -1 && a == c && d != -1) reslt[3, 1] = 2;    // 1,0,1,2
            if (a != -1 && a == b && c == -1 && d != -1) reslt[3, 1] = 2;               // 1,1,0,2
            if (a != -1 && a == b && c != -1 && c == d) reslt[3, 1] = 2;                // 1,1,2,2
            if (a != -1 && a == b && c != -1 && d != -1 && c != d) reslt[3, 1] = 1;     // 1,1,2,3
            if (a != -1 && b != -1 && a != b && b == c && d != -1) reslt[3, 1] = 2;     // 1,2,2,3
            if (a != -1 && b != -1 && a != b && c != -1 && c == d) reslt[3, 1] = 1;     // 1,2,3,3


            // 计算移动完毕后的结果
            for (int i = 0; i < 4 - 1; i++) // 先清除零位
            {
                if (a == -1)
                {
                    a = b; b = c; c = d; d = -1;
                }
                if (b == -1)
                {
                    b = c; c = d; d = -1;
                }
                if (c == -1)
                {
                    c = d; d = -1;
                }
            }
            
            if (a > -1 && a == b) // 合并相同的数字
            {
                a++; b = -1;
            }
            if (b > -1 && b == c)
            {
                b++; c = -1;
            }
            if (c > -1 && c == d)
            {
                c++; d = -1;
            }
            
            for (int i = 0; i < 4 - 1; i++) // 再次清除零位
            {
                if (a == -1)
                {
                    a = b; b = c; c = d; d = -1;
                }
                if (b == -1)
                {
                    b = c; c = d; d = -1;
                }
                if (c == -1)
                {
                    c = d; d = -1;
                }
            }
            reslt[0, 0] = a;
            reslt[1, 0] = b;
            reslt[2, 0] = c;
            reslt[3, 0] = d;

            return reslt;
        }
    }
}
